/**
 * 获取路径信息
 * @param mix string|int 绝对路径 或 相对工作路径 或 文件描述符
 * @param opt json|string|boolean|null 选项
 * 		- string=>{way:opt},  boolean=>{ign:opt}
 * 		way: string 处理方式  fstat:参数mix为文件描述符
 * 			stat:路径取软连接指向(默认), lstat:路径取软连接本身
 * 		big: boolean 返回数值是否bigint  默认:false
 * 		ign: boolean 不存在是否忽略异常  默认false:抛出异常
 * 		syn: boolean 是否同步操作  默认false:异步
 * @return Promise|stat|null !opt.syn->Promise null:不存在且ign
 * 		stat追加: fstat ? fd=文件描述符(mix) : full=绝对路径
 * 			opt.way=stat时: full=>mix指向路径,非软连接指向路径
 */
$.fsStat = function(mix, opt=null){
	const $FS=require('node:fs'), $PATH=require('node:path');
	const DEF = {way:'stat',ign:false,syn:false,big:false};
	const ERR = (e,o)=>{
		let x = e.code==='ENOENT' || e.code==='ENXIO';
		if(x&&o.ign) return null; $.err('$.fsStat',e);
	};
	const MIX = (m, v, way)=>{ // 追加: fd/full
		if(way==='fstat'){ m.fd=v*1; return m; }
		m.full=$PATH.resolve(v);  return m;
	};
	$.fsStat = function(mix, opt=null){
		const typ = typeof opt;
		if(typ==='string') opt = {way:opt};
		else if(typ==='boolean') opt={ign:opt};
		opt=$.mix({},DEF,opt); let w=opt.way, m;
		const opx = {bigint:opt.big};
		if(opt.syn){
			try{ m = $FS[w+'Sync'](mix,opx); }
			catch(err){ return ERR(err,opt); }
			return MIX(m, mix, w);
		}
		return $.fsAsync(w,mix,opx).then(m=>MIX(m,mix,w))
			.catch(err=>ERR(err,opt));
	};
	return $.fsStat(mix, opt);
};
